#include "stdafx.h"
#include "UploadCtlCtrl.h"

/////////////////////////////////////////////////////////////
// IObjectSafety member functions
    
ULONG FAR EXPORT CUploadCtlCtrl::XObjSafe::AddRef()
{
	METHOD_PROLOGUE(CUploadCtlCtrl, ObjSafe)
	return pThis->ExternalAddRef();
}
    
ULONG FAR EXPORT CUploadCtlCtrl::XObjSafe::Release()
{
	METHOD_PROLOGUE(CUploadCtlCtrl, ObjSafe)
	return pThis->ExternalRelease();
}

HRESULT FAR EXPORT CUploadCtlCtrl::XObjSafe::QueryInterface(
        REFIID iid, void FAR* FAR* ppvObj)
{
	METHOD_PROLOGUE(CUploadCtlCtrl, ObjSafe)
	return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}


const DWORD dwSupportedBits = INTERFACESAFE_FOR_UNTRUSTED_CALLER |
            INTERFACESAFE_FOR_UNTRUSTED_DATA;
    const DWORD dwNotSupportedBits = ~ dwSupportedBits;

HRESULT STDMETHODCALLTYPE 
        CUploadCtlCtrl::XObjSafe::GetInterfaceSafetyOptions(
            /* [in] */ REFIID riid,
            /* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,
            /* [out] */ DWORD __RPC_FAR *pdwEnabledOptions)
{
	METHOD_PROLOGUE(CUploadCtlCtrl, ObjSafe)

	HRESULT retval = ResultFromScode(S_OK);

	// does interface exist?
	IUnknown FAR* punkInterface;
	retval = pThis->ExternalQueryInterface(&riid, (void **)&punkInterface);
	if (retval != E_NOINTERFACE) {  // interface exists
		punkInterface->Release(); // release it--just checking!
	}

	// we support both kinds of safety and have always both set,
	// regardless of interface
	*pdwSupportedOptions = *pdwEnabledOptions = dwSupportedBits;

	return retval; // E_NOINTERFACE if QI failed
}

HRESULT STDMETHODCALLTYPE 
        CUploadCtlCtrl::XObjSafe::SetInterfaceSafetyOptions( 
            /* [in] */ REFIID riid,
            /* [in] */ DWORD dwOptionSetMask,
            /* [in] */ DWORD dwEnabledOptions)
{
	METHOD_PROLOGUE(CUploadCtlCtrl, ObjSafe)
        
	// does interface exist?
	IUnknown FAR* punkInterface;
	pThis->ExternalQueryInterface(&riid, (void**)&punkInterface);
    if (punkInterface) {    // interface exists
		punkInterface->Release(); // release it--just checking!
	}
	else { // interface doesn't exist
		return ResultFromScode(E_NOINTERFACE);
	}
    
	// can't set bits we don't support
	if (dwOptionSetMask & dwNotSupportedBits) { 
		return ResultFromScode(E_FAIL);
	}
       
	// can't set bits we do support to zero
	dwEnabledOptions &= dwSupportedBits;
	// (we already know there are no extra bits in mask )
	if ((dwOptionSetMask & dwEnabledOptions) !=	dwOptionSetMask) {
		return ResultFromScode(E_FAIL);
	}
        
	// don't need to change anything since we're always safe
	return ResultFromScode(S_OK);
}